#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    image_captcha_recognizer.py
   Author :       zyq
   CreateDate：   2024/7/15 10:54
   Remark :  Python descriptor
-------------------------------------------------
"""

"""
验证码识别功能
"""

import ddddocr
from PIL import Image

from guitesting.config.Path import *


def image_identify(driver, ele, whole_name, crop_name):
    """
    对页面中的指定元素进行截图并识别图片中的文字。

    Args:
        driver (WebDriver): WebDriver实例，用于页面交互和截图。
        ele (WebElement): WebElement实例，需要截图的页面元素。
        whole_name (str): 完整截图图片的名称（包含路径）。
        crop_name (str): 裁剪后截图验证码图片的名称（包含路径）。

    Returns:
        str: OCR识别结果，即图片中的文字内容。
    """
    whole_name = os.path.join(IMG_DIR, whole_name)
    crop_name = os.path.join(IMG_DIR, crop_name)

    # 截图并保存整个页面
    save_full_screenshot(driver, whole_name)

    # 裁剪指定元素并保存
    crop_element_image(ele, whole_name, crop_name)

    # 进行OCR识别
    ocr_result = perform_ocr(crop_name)

    # 返回OCR识别结果
    return ocr_result


def save_full_screenshot(driver, filename):
    """
    保存整个页面的截图。

    Args:
        driver (WebDriver): WebDriver对象，用于控制浏览器并保存截图。
        filename (str): 保存截图的文件名（包含路径）。

    Returns:
        None: 此函数不返回任何值，而是将截图保存到指定路径的文件中。

    """
    # 使用WebDriver的save_screenshot方法保存整个页面的截图
    driver.save_screenshot(filename)


def crop_element_image(element, whole_image_name, cropped_image_name):
    """
    从给定的完整图片中裁剪出指定元素所在的区域，并保存到指定路径。

    Args:
        element (WebElement): 需要裁剪的页面元素对象，具有location和size属性。
        whole_image_path (str): 完整图片的文件路径。
        cropped_image_path (str): 裁剪后的图片需要保存的文件路径。

    Returns:
        None: 该函数没有返回值，而是直接保存裁剪后的图片到指定路径。

    """
    # print("获取element的标准：", element.size, element.location)
    # 获取元素左上角的x坐标
    left = element.location['x'] + 950
    # 获取元素左上角的y坐标
    top = element.location['y'] + 420

    # print("left", left, "top", top)

    # 计算元素右下角的x坐标
    right = element.size['width'] + left + 100
    # 计算元素右下角的y坐标
    height = element.size['height'] + top + 28

    # print(element.size['width'], element.size['height'])

    # print("right", right, "height", height)

    # 打开完整图片文件
    image = Image.open(whole_image_name)
    # 裁剪图片
    cropped_image = image.crop((left, top, right, height))
    # 保存裁剪后的图片到指定路径
    cropped_image.save(cropped_image_name)


def perform_ocr(image_path):
    """
    对给定路径下的图片进行OCR识别，并返回识别结果。

    Args:
        image_path (str): 待识别图片的文件路径。

    Returns:
        str: OCR识别的结果，返回的是一个字符串类型的数据。

    """
    # 创建一个OCR识别对象
    ocr = ddddocr.DdddOcr(show_ad=False)
    # 使用二进制模式打开图片文件
    with open(image_path, 'rb') as file:
        # 读取图片数据
        image_data = file.read()
    # 对图片数据进行OCR识别
    ocr_result = ocr.classification(image_data)
    # 打印识别结果，可根据需要移除或替换为日志记录
    print("图片识别结果：", ocr_result)  # 可根据需要移除或替换为日志记录
    # 返回识别结果
    return ocr_result


if __name__ == '__main__':
    # 测试图片识别是否成功
    perform_ocr('test01.png')
